package com.heba.utils;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.TextAppearanceSpan;

import com.heba.Debug;
import com.heba.bean.search.CategorySearchObject;
import com.heba.greenmulu.R;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 验证手机，电邮等
 * <p>
 * Created by shenghao on 2015/8/5.
 */
public class CommonUtils {

    /**
     * 验证手机格式
     */
    public static boolean isMobileNO(String mobiles) {
        /*
        移动：134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
		联通：130、131、132、152、155、156、185、186
		电信：133、153、180、189、（1349卫通）
		总结起来就是第一位必定为1，第二位必定为3或5或8，其他位置的可以为0-9
		*/
        String telRegex = "[1][34578]\\d{9}";//"[1]"代表第1位为数字1，"[358]"代表第二位可以为3、5、8中的一个，"\\d{9}"代表后面是可以是0～9的数字，有9位。
        if (TextUtils.isEmpty(mobiles)) return false;
        else return mobiles.matches(telRegex);
    }

    /**
     * @param email
     * @return
     */
    public static boolean isEmail(String email) {
        String str = "^([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)*@([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$";
        Pattern p = Pattern.compile(str);
        Matcher m = p.matcher(email);
        return m.matches();
    }

    /**
     * 验证昵称,只能输入字母，数字，下划线，中文，不允许其它非法字符
     *
     * @param userName
     * @return
     */
    public static boolean checkUserName(String userName) {
        String regex = "([a-z]|[A-Z]|[0-9]|[\\u4e00-\\u9fa5]|[_])+";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(userName);
        return m.matches();
    }

    /**
     * 验证登录密码 只能输入字母、数字
     *
     * @param password
     * @return
     */
    public static boolean checkLoginPassword(String password) {
        String regex = "[A-Z,a-z,0-9]*";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(password);
        return m.matches();
    }

    /**
     * 判断手机中是否安装第三方软件
     *
     * @param context
     * @param packageName
     * @return 判断pName中是否有目标程序的包名，有TRUE，没有FALSE
     */
    public static boolean isAvilible(Context context, String packageName) {
        final PackageManager packageManager = context.getPackageManager();//获取packagemanager
        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);//获取所有已安装程序的包信息
        List<String> pName = new ArrayList<String>();//用于存储所有已安装程序的包名
        //从pinfo中将包名字逐一取出，压入pName list中
        if (pinfo != null) {
            for (int i = 0; i < pinfo.size(); i++) {
                String pn = pinfo.get(i).packageName;
                pName.add(pn);
            }
        }
        return pName.contains(packageName);
    }

    /**
     * 针对TextView显示中文中出现的排版错乱问题，通过调用此方法得以解决
     *
     * @param str
     * @return 返回全部为全角字符的字符串
     */
    public static String toDBC(String str) {
        char[] c = str.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == 12288) {
                c[i] = (char) 32;
                continue;
            }
            if (c[i] > 65280 && c[i] < 65375) {
                c[i] = (char) (c[i] - 65248);
            }

        }
        return new String(c);
    }

    /**
     * 计算距离转换
     *
     * @param distance 单位米
     * @return
     */
    public static String getDistancetransform1(Context context, int distance) {
        String content;
        float kilometer;
        if (distance > 999) {
            //将米转换成公里
            DecimalFormat decimalFormat = new DecimalFormat(".00");  //构造方法的字符格式这里如果小数不足2位,会以0补足.
            kilometer = Float.valueOf(distance) / 1000f;
            content = decimalFormat.format(kilometer) + "km";
            return content;
        } else {
            //直接输出距离 米数
            content = distance + "m";
            return content;
        }
    }

    /**
     * 计算距离转换
     *
     * @param distance 单位米
     * @return
     */
    public static String getDistancetransform2(Context context, int distance) {
        String content;
        float kilometer;
        if (distance > 999) {
            //将米转换成公里
            DecimalFormat decimalFormat = new DecimalFormat("");
            kilometer = Float.valueOf(distance) / 1000f;
            content = decimalFormat.format(kilometer) + "km";
            return content;
        } else {
            //直接输出距离 米数
            content = distance + "m";
            return content;
        }
    }

    /**
     * 根据出生日期计算年龄
     *
     * @param dateOfBirth
     * @return
     */
    public static int getAge(Date dateOfBirth) {
        int age = 0;
        Calendar born = Calendar.getInstance();
        Calendar now = Calendar.getInstance();
        if (dateOfBirth != null) {
            now.setTime(new Date());
            born.setTime(dateOfBirth);
            if (born.after(now)) {
                throw new IllegalArgumentException("年龄不能超过当前日期");
            }
            age = now.get(Calendar.YEAR) - born.get(Calendar.YEAR);
            int nowDayOfYear = now.get(Calendar.DAY_OF_YEAR);
            int bornDayOfYear = born.get(Calendar.DAY_OF_YEAR);
            Debug.Log("", "nowDayOfYear:" + nowDayOfYear + " bornDayOfYear:" + bornDayOfYear);
            if (nowDayOfYear < bornDayOfYear) {
                age -= 1;
            }
        }
        return age;
    }

    /**
     * 使用java正则表达式去掉多余的.与0
     *
     * @param s
     * @return
     */
    public static String subZeroAndDot(String s) {
        if (s.indexOf(".") > 0) {
            s = s.replaceAll("0+?$", "");//去掉多余的0
            s = s.replaceAll("[.]$", "");//如最后一位是.则去掉
        }
        return s;
    }

    /**
     * 复制字符串到剪贴板
     *
     * @param context
     * @param text
     */
    public static void copyText2Clipboard(Context context, String text) {
        //获取剪贴板管理器
        ClipboardManager cm = (ClipboardManager) context.getSystemService(context.CLIPBOARD_SERVICE);
        //创建普通字符型ClipData
        ClipData mClipData = ClipData.newPlainText("label", text);
        //将ClipData内容放到系统剪贴板里
        cm.setPrimaryClip(mClipData);
    }

    /**
     * 移除空行
     *
     * @param text
     * @return
     */
    public static String removeBlankLine(String text) {
        if (text.isEmpty())
            return "";
        return text.replaceAll("(?m)^\\s*$[\\n|\\r\\n]", "");
    }

    /**
     * 匹配字符改变颜色
     *
     * @param context
     * @param text
     * @param keyword
     * @return
     */
    public static SpannableString matcherSearchText(Context context, String text, String keyword) {
        SpannableString ss = new SpannableString(text);
        Pattern pattern = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(ss);
        while (matcher.find()) {
            int start = matcher.start();
            int end = matcher.end();
            ss.setSpan(new TextAppearanceSpan(context, R.style.StyleColorGreen), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//new ForegroundColorSpan(color)
        }
        return ss;
    }

    /**
     * 文字编码
     *
     * @param text
     * @return
     */
    public static String getEncodeText(String text) {
        try {
            String s = URLEncoder.encode(text, "UTF-8");
            return s;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 文字解码
     *
     * @param text
     * @return
     */
    public static String getDecodeText(String text) {
        try {
            String str = text.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
            String s = URLDecoder.decode(str, "UTF-8");
            return s;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 显示分类字符串
     *
     * @param category
     * @return
     */
    public static String calculateCategoryString(CategorySearchObject category) {
        StringBuffer sb = new StringBuffer();
        if (!category.getName1().isEmpty()) {
            sb.append(category.getName1());
            sb.append(" > ");
        }
        if (!category.getName2().isEmpty()) {
            sb.append(category.getName2());
            sb.append(" > ");
        }
        if (!category.getName3().isEmpty()) {
            sb.append(category.getName3());
            sb.append(" > ");
        }
        if (!category.getName4().isEmpty()) {
            sb.append(category.getName4());
            sb.append(" > ");
        }
        sb.delete(sb.length() - 3, sb.length());
        return sb.toString();
    }

}
